const { loadAllRoutes } = require('../routes/policy-route')
const { login } = require('../utils/common-utils')

describe('开启密码策略后，验证策略应用主体', () => {
  // 加载 fixture
  const policyData = require('../fixtures/policy-data')
  const initData = require('../fixtures/init-data')

  // 为了自动生成用例
  const userList = initData.users
  const appList = initData.apps

  beforeEach(function () {
    // 注册 route
    loadAllRoutes()

    // 加载初始化数据
    this.userPolicy = policyData.userPolicy

    // 登录
    login()
  })

  after(function () {
    loadAllRoutes()
    login()

    // 清除成员数据
    const cleanUsers = () => {
      cy.visitUserManager()
      cy.get('.ant-checkbox-input').eq(0).check()
      cy.get('[class*=styles_quicklyActions] .ant-space-item').eq(1).click()
      cy.get('.ant-modal-body').within(() => {
        cy.get('button').eq(1).click()
      })
      cy.wait('@batchDeleteUser')
      cy.get('.ant-notification-notice-message').contains('删除成功')
    }

    // 清除自建应用数据
    const cleanApps = () => {
      cy.visitBuiltApps()
      cy.wait('@queryApp')
      cy.get('.ant-input').type(appList[0].name)
      cy.wait('@queryAppByKeyword')
      cy.wait('@userLoginHotDots')
      cy.get('[data-container="simpleCard"]').then(($el) => {
        $el.trigger('mouseover')
        cy.wrap($el).within(() => {
          cy.get('[class*=styles_simpleCardActions]').click()
          cy.get('.ant-dropdown-menu-item').click()
        })
        cy.get('.ant-modal-body').within(() => {
          cy.get('button').eq(1).click()
        })
        cy.wait('@deleteApp')
        cy.wait('@queryApp')
        cy.wait('@userLoginHotDots')
        cy.get('.ant-notification-notice-message').contains('删除成功')
      })
    }
    cleanUsers()
    cleanApps()
  })

  // 初始化成员数据
  userList.forEach((user) => {
    it(`创建初始化成员 username: ${user.username}`, function () {
      cy.visitUserManager()
      cy.wait('@userFilter')
      // 创建成员按钮
      cy.get('.ant-spin-container').within(() => {
        if (Cypress.$('[class*=styles_simpleEmpty]').length === 1) {
          cy.xpath('//span[contains(text(),"创建成员")]').click()
        } else {
          cy.xpath('//button[contains(text(),"创建成员")]').click()
        }
      })
      // 创建成员表单
      cy.get('.ant-modal-content').within(() => {
        cy.getElementAssertText('div[id^=rcDialogTitle]', '创建成员')
        cy.get('#create-user-form_username').type(user.username)
        cy.get('#create-user-form_password').type(user.password)
        cy.get('#create-user-form_confirmPassword').type(user.password)
        cy.xpath('//div[@class="ant-modal-content"]//button[contains(text(),"确定")]').click()
      })
      cy.wait('@userFilter')
      cy.get('.ant-notification-notice-message').contains('创建成功')
    })
  })

  // 初始化自建应用数据
  appList.forEach((app) => {
    it(`创建初始化自建应用 name: ${app.name} - identifier: ${app.identifier}`, function () {
      cy.visitBuiltApps()
      cy.get('button[data-log="selfbuiltApp/pageTitle/create"]').click()

      cy.get('.ant-modal-content').within(() => {
        cy.getElementAssertText('[id*=rcDialogTitle]', '创建自建应用')
        cy.get('#name').type(app.name)
        cy.get('#identifier').type(app.identifier)
        cy.get('[class*=styles_uiButton]').eq(1).click()
      })
      cy.wait('@detailApp')
      cy.get('.ant-notification-notice-message').contains('创建应用成功！')
    })
  })

  it('当前策略所选主体中的用户，使用当前策略 - 用户', function () {
    const createPolicy = (pageTitle, policyName, policyDescribe, subjectType) => {
      // 密码安全页面
      cy.visitMainMenuPwdScy()
      cy.get('[class*=styles_authing-base-middle-button]').click()
      cy.getElementAssertText('p[class*=styles_title_]', pageTitle)

      // 策略基础内容
      cy.get('#policyName').type(policyName)
      cy.get('#policyDescribe').type(policyDescribe)

      if (subjectType === 'user') {
        cy.get('.ant-select-selection-placeholder').type(userList[0].username)

        // 等待查询
        cy.wait('@searchUserGqlQueryVars')
        cy.get('.ant-select-item-option-content').click()
        cy.getElementAssertText('.ant-select-selection-item-content', userList[0].username)
      }

      // 密码规则
      cy.get('#passwordStrength .ant-radio').eq(1).click()
      cy.get('#enablePasswordDetection').click()

      // 提交表单
      cy.get('button[type=submit]').click()
      cy.wait('@createPolicy')
      cy.wait('@queryPolicy')
      cy.get('.ant-notification-notice-message').contains('创建成功')
    }

    const test = (username, password, subject) => {
      // 新页面
      cy.visit(`https://${appList[0].identifier}.authing.cn/login`)

      cy.getElementAssertText('div.title', appList[0].name)

      // 账号密码
      cy.get('[id*=-tab-password]¡').click()

      // 测试账号一
      cy.get('#passworLogin_account').clear().type(username)
      cy.get('#passworLogin_password').type(password)
      cy.get('.authing-g2-submit-button').click()
      if (subject) {
        cy.getElementAssertText('div.title', `欢迎访问 ${appList[0].name}`)
        cy.getElementAssertText('.title-explain', '你的密码不符合当前密码强度要求，请设置新密码。')
        cy.get('#resetPassword_password').type('123456')
        cy.get('#resetPassword_password2').type('123456')
        cy.get('.authing-g2-submit-button').click()
        cy.wait('@authFlow')
        cy.getElementAssertText('.authing-ant-message-custom-content', '修改密码成功')
        cy.get('#passworLogin_account').clear().type(username)
        cy.get('#passworLogin_password').type('123456')
        cy.get('.authing-g2-submit-button').click()
      }
      // 非主体
      cy.wait('@guideStarted')
      cy.location('pathname').should('contain', '/get-started')
      cy.get('[class*=styles_titlewarp] button').eq(1).click()
      cy.get('.ant-modal-body').find('button').eq(1).click()
      // cy.location('pathname').should('contain', '/login')
    }

    const cleanPolicy = () => {
      // 密码安全页面
      cy.visitMainMenuPwdScy()
      cy.get('td .ant-dropdown-trigger').click()
      cy.get('[class*=styles_actions] li').click()
      cy.get('.ant-modal-body').within(() => {
        cy.get('button').eq(1).click()
      })

      cy.wait('@deletePolicy')
      cy.wait('@queryPolicy')
      cy.get('.ant-notification-notice-message').contains('删除成功')
    }
    createPolicy(this.userPolicy.pageTitle, this.userPolicy.policyName, this.userPolicy.policyDescribe, 'user')
    // test(userList[1].username, userList[1].password, false)
    test(userList[0].username, userList[0].password, true)
    cleanPolicy()
  })
})
